home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-07-17 | 38.8 KB | 1,099 lines |
- /* Camp 1.0 - GUI for mpega 2.9 */
- /* Author: Eric Sauvageau
- Compiler: EC 3.2e
- Needs: ClassAct 2.0, asl.library, mpega 2.9+
- Release: Freeware
- */
-
- /* FEATURES:
-
- - Fully font-sensitive GUI (no hardcoded crap)
- - Can display the header information of the current mpega
- - Multithreaded - You can start playing an mp3, and quit CAMP
- while it's still playing
- - Doesn't rely on external programs to stop playing neither on
- CPU-hogger kludges.
-
- TODO:
-
- - Play a complete list. For this, we'll have to point our
- CreateNewProc() to a procedure instead of to the mpega seglist.
- That procedure (spawned as a separate process) would handle
- playing a supplied list, launching mpega as many times as needed.
-
- One problem tho: how to be able to signal mpega so it stops
- playing when the user clicks on "Stop"? The solution seems to
- lies in a non-implemented tag for CreateNewProc():
- NP_NotifyOnDeath :( Signaling the process that launched
-
-
- - Pipe'ing mpega's text output so we could display it in our
- own (nicely formatted) window.
-
-
- - Finish the "Default" button in the prefs.
- */
-
- OPT PREPROCESS
-
- MODULE 'tools/boopsi','tools/inithook','other/geta4'
-
- MODULE 'exec/nodes','intuition','graphics','intuition/intuition',
- 'intuition/gadgetclass','intuition/imageclass','exec/lists',
- 'intuition/intuitionbase','intuition/classusr',
- 'intuition/gadgetclass','intuition/cghooks','intuition/icclass',
- 'intuition/classes','tools/constructors','intuition/screens'
-
- MODULE 'libraries/gadtools','intuition/icclass','dos','dos/dos','icon',
- 'graphics','intuition','intuition/intuition','utility/tagitem',
- 'exec/semaphores','exec/libraries','exec/ports','graphics/view',
- 'bevel','images/bevel','tools/classact_lib',
- 'utility/hooks','workbench/workbench','workbench/startup'
-
- MODULE 'other/classact','window','classes/window','layout','gadgets/layout','gadgets/integer',
- 'gadgets/checkbox','images/bevel','integer','images/label','label',
- 'classes/window','other/classact_macros','checkbox',
- 'button','gadgets/button','gadgets/chooser',
- 'chooser','string','gadgets/string','dos/dostags','asl','libraries/asl'
-
- MODULE 'exec/memory'
-
-
- /* General exceptions */
- RAISE "FAIL" IF CreateMsgPort() = NIL
-
-
- /* Gadget IDs */
- ENUM GAD_PLAY=1, GAD_FILENAME, GAD_POP, GAD_FREQDIV, GAD_QUALITY,
- GAD_PRI, GAD_BUFFER, GAD_VOLUME, GAD_FILEBUFFER, GAD_NOCOUNTER,
- GAD_NOAUDIO, GAD_MONO, GAD_WAITBUF, GAD_TIMECOUNT, GAD_FILTER,
- GAD_AUDIOMIX, GAD_AUDIOMIXFREQ, GAD_LIMITDECODE, GAD_LIMITDECODEFREQ,
- GAD_SEEK, GAD_SEEKTIME, GAD_QUIET, GAD_PREFS,GAD_AHI, GAD_AHIMODE,
- GAD_SAVE,GAD_USE,GAD_CANCEL
-
-
-
- /* Used for getFile() */
- ENUM GET_FILE=1, -> Get a sound filename
- GET_MPEGA -> Get the mpega path/filename for the prefs.
-
-
- /* Prefs options struct - used for load/save */
-
- CONST PREFSVER=01
-
- OBJECT campPrefs
- freqdiv:INT
- quality:INT
- taskpri:INT
- volume:INT
- buffer:LONG
- filebuf:LONG
- quiet:INT
- silent:INT
- mono:INT
- waitbuf:INT
- nocounter:INT
- timecount:INT
- filter:INT
- audiomix:INT
- audiomixfreq:LONG
- limitdecode:INT
- limitfreq:LONG
- ahi:INT
- ahimode:LONG
- seek:INT
- seektime:LONG
- ENDOBJECT
-
- /* Global defs */
-
- DEF filenameobj:PTR TO object,
- playobj:PTR TO object,
- mpegapath[256]:STRING,
- window:PTR TO window,
- title[120]:STRING,
- tmparg[120]:STRING,
- scr:PTR TO screen,
- condef[128]:STRING
-
-
-
- PROC main() HANDLE
- DEF win_object:PTR TO object,
- appport=NIL:PTR TO mp,
- signal,asig,
- done=FALSE,
- result,
- code,
- tmpres1,
- apphook:hook,
- filename[256]:STRING,
- args1[80]:STRING,
- args2[10]:STRING,
- proc,
- handle,
- preferences:campPrefs,
-
- qualitylist=NIL:PTR TO lh,
- freqlist=NIL:PTR TO lh,
- ahiobj,
- ahimodeobj,
- freqdivobj,
- qualityobj,
- priobj,
- bufferobj,
- volumeobj,
- filebufferobj,
- audiomixobj,
- audiomixfreqobj,
- limitdecodeobj,
- limitdecodefreqobj,
- seekobj,
- seektimeobj,
- nocounterobj,
- monoobj,
- silentobj,
- filterobj,
- waitbufobj,
- timecountobj,
- quietobj
-
-
-
- windowbase := myOpenClass('window.class',41)
- layoutbase := myOpenClass('gadgets/layout.gadget',41)
- checkboxbase := myOpenClass('gadgets/checkbox.gadget',0)
- integerbase := myOpenClass('gadgets/integer.gadget',0)
- labelbase := myOpenClass('images/label.image',0)
- buttonbase := myOpenClass('gadgets/button.gadget',0)
- chooserbase := myOpenClass('gadgets/chooser.gadget',0)
- bevelbase := myOpenClass('images/bevel.image',0)
- stringbase := myOpenClass('gadgets/string.gadget',0)
- iconbase := myOpenClass('icon.library',0,TRUE)
-
- freqlist := chooserLabelsA(['Normal','Freq/2','Freq/4',NIL])
- qualitylist := chooserLabelsA(['Worst','Average','Best',NIL])
-
- appport := CreateMsgPort()
-
- scr:=LockPubScreen(NIL)
-
- inithook(apphook,{appMsgFunc},filenameobj)
-
- IF (handle := Open({prefsname},MODE_OLDFILE))
- IF (code := FgetC(handle)=PREFSVER) -> Version
- Fgets(handle,mpegapath,255)
- SetStr(mpegapath,StrLen(mpegapath)-1) -> Chop last char (CR)
- Fgets(handle,condef,255)
- SetStr(condef,StrLen(condef)-1) -> Chop last char (CR)
- Fread(handle,preferences,SIZEOF campPrefs,1)
- ELSE
- defaultPrefs(preferences)
- ENDIF
- Close(handle)
- ELSE
-
- /* Default prefs */
- defaultPrefs(preferences)
-
- ENDIF
-
-
- win_object := WindowObject,
- WA_TITLE, 'CAMP 1.0',
- WA_DEPTHGADGET, TRUE,
- WA_SIZEBBOTTOM, TRUE,
- WA_SIZEGADGET,TRUE,
- WA_DRAGBAR, TRUE,
- WA_RMBTRAP, TRUE,
- WA_ACTIVATE,TRUE,
- WA_CLOSEGADGET,TRUE,
- WINDOW_APPPORT, appport,
- WINDOW_APPWINDOW, TRUE,
- WINDOW_APPMSGHOOK, apphook,
-
- WINDOW_ICONIFYGADGET, TRUE,
- WINDOW_ICON, GetDiskObjectNew('PROGDIR:camp'),
- WINDOW_ICONTITLE, 'CAMP',
- WINDOW_POSITION, WPOS_CENTERSCREEN,
- WINDOW_LOCKHEIGHT, TRUE,
-
- WINDOW_PARENTGROUP, VGroupObject,
- LAYOUT_DEFERLAYOUT, TRUE,
- LAYOUT_SPACEOUTER, TRUE,
-
- StartHGroup,
-
- StartVGroup, EvenSized,
- LAYOUT_BEVELSTYLE, BVS_GROUP,
- LAYOUT_SPACEOUTER, TRUE,
- LAYOUT_LABEL,'Functions',
-
- StartMember, playobj := ButtonObject,
- GA_TEXT,'_Play/Stop',
- GA_ID, GAD_PLAY,
- GA_DISABLED, TRUE,
-
- GA_RELVERIFY,TRUE,
- EndMember,
- CHILD_SCALEWIDTH, 10,
-
- StartMember, ButtonObject,
- GA_TEXT,'Pref_s',
- GA_ID, GAD_PREFS,
- GA_RELVERIFY,TRUE,
- EndMember,
-
- EndVGroup,
- CHILD_WEIGHTEDHEIGHT, 0,
- CHILD_WEIGHTEDWIDTH,0,
-
- StartVGroup,
-
- StartHGroup,
- StartMember, filenameobj := StringObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_FILENAME,
- STRINGA_MAXCHARS, 256,
- STRINGA_MINVISIBLE, 10,
- EndMember,
- MemberLabel('File_name'),
-
- StartMember, ButtonObject,
- BUTTON_AUTOBUTTON, BAG_POPFILE,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_POP,
- EndMember,
- CHILD_WEIGHTEDWIDTH, 0,
- CHILD_WEIGHTEDHEIGHT,0,
-
- EndGroup,
- CHILD_WEIGHTEDHEIGHT,0,
-
- StartHGroup,
-
- StartVGroup,
- StartMember, freqdivobj := ChooserObject,
- CHOOSER_LABELS, freqlist,
- CHOOSER_SELECTED, preferences.freqdiv,
- GA_ID, GAD_FREQDIV,
- EndMember,
- MemberLabel('_Frequency'),
-
- StartMember, filebufferobj := IntegerObject,
- GA_ID, GAD_FILEBUFFER,
- INTEGER_NUMBER, preferences.filebuf,
- INTEGER_MAXCHARS, 4,
- INTEGER_MINIMUM, 1,
- INTEGER_MAXIMUM, 1024,
- EndMember,
- MemberLabel('I/O _Buffer (Kb)'),
-
- StartMember, bufferobj := IntegerObject,
- GA_ID, GAD_BUFFER,
- INTEGER_NUMBER, preferences.buffer,
- INTEGER_MAXCHARS, 7,
- INTEGER_MINIMUM, 1,
- EndMember,
- MemberLabel('Buffer _Time (ms)'),
-
- EndGroup,
-
- StartVGroup,
-
- StartMember, qualityobj := ChooserObject,
- CHOOSER_LABELS, qualitylist,
- GA_ID, GAD_QUALITY,
- CHOOSER_SELECTED, preferences.quality,
- EndMember,
- MemberLabel('_Quality'),
-
- StartMember, volumeobj := IntegerObject,
- GA_ID, GAD_VOLUME,
- INTEGER_NUMBER, preferences.volume,
- INTEGER_MAXCHARS, 4,
- INTEGER_MINIMUM, 0,
- INTEGER_MAXIMUM, 400,
- EndMember,
- MemberLabel('_Volume (%)'),
-
- StartMember, priobj := IntegerObject,
- GA_ID, GAD_PRI,
- INTEGER_NUMBER, preferences.taskpri,
- INTEGER_MAXCHARS, 3,
- INTEGER_MINIMUM, -30,
- INTEGER_MAXIMUM, 30,
- EndMember,
- MemberLabel('Tas_k Priority'),
-
- EndGroup,
- EndGroup,
-
-
- EndGroup,
-
- EndGroup,
-
- StartHGroup,
- StartVGroup,
- StartMember, waitbufobj := CheckBoxObject,
- GA_ID, GAD_WAITBUF,
- GA_TEXT, '_Wait for buffer',
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- GA_SELECTED, preferences.waitbuf,
- EndMember,
-
- StartMember, filterobj := CheckBoxObject,
- GA_ID, GAD_FILTER,
- GA_TEXT, 'Audio Fi_lter',
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- GA_SELECTED, preferences.filter,
- EndMember,
-
- StartMember, monoobj:= CheckBoxObject,
- GA_ID, GAD_MONO,
- GA_TEXT, '_Mono output',
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- GA_SELECTED, preferences.mono,
- EndMember,
-
- StartMember, silentobj := CheckBoxObject,
- GA_ID, GAD_NOAUDIO,
- GA_TEXT, 'No _Audio',
- GA_SELECTED, preferences.silent,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- EndGroup,
- CHILD_WEIGHTEDWIDTH,0,
-
- StartVGroup,
- StartMember, quietobj:= CheckBoxObject,
- GA_ID, GAD_QUIET,
- GA_RELVERIFY, TRUE,
- GA_TEXT, 'No _Output',
- GA_SELECTED, preferences.quiet,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- StartMember, nocounterobj := CheckBoxObject,
- GA_ID, GAD_NOCOUNTER,
- GA_TEXT, 'No _Counter',
- GA_SELECTED, preferences.nocounter,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- GA_DISABLED, (IF preferences.quiet THEN TRUE ELSE FALSE),
- EndMember,
-
-
- StartMember, timecountobj := CheckBoxObject,
- GA_ID, GAD_TIMECOUNT,
- GA_TEXT, '_Display Time',
- GA_SELECTED, preferences.timecount,
- GA_DISABLED, (IF preferences.quiet THEN TRUE ELSE FALSE),
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- EndGroup,
- CHILD_WEIGHTEDWIDTH,0,
-
- StartHGroup,
-
- LAYOUT_BEVELSTYLE, BVS_GROUP,
- LAYOUT_SPACEOUTER, TRUE,
-
- StartVGroup,
-
- StartMember, audiomixobj := CheckBoxObject,
- GA_ID, GAD_AUDIOMIX,
- GA_RELVERIFY, TRUE,
- GA_SELECTED, preferences.audiomix,
- GA_TEXT, 'Audio Mi_xing',
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- StartMember, limitdecodeobj := CheckBoxObject,
- GA_ID, GAD_LIMITDECODE,
- GA_RELVERIFY, TRUE,
- GA_TEXT, 'L_imit Decode Freq.',
- GA_SELECTED, preferences.limitdecode,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- StartMember, seekobj := CheckBoxObject,
- GA_TEXT, 'S_eek Position (ms)',
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_SEEK,
- GA_SELECTED, preferences.seek,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
-
- StartMember, ahiobj := CheckBoxObject,
- GA_TEXT, 'A_HI AudioMode (hex)',
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_AHI,
- GA_SELECTED, preferences.ahi,
- CHECKBOX_TEXTPLACE, PLACETEXT_LEFT,
- EndMember,
- EndGroup,
-
- StartVGroup,
- StartMember, audiomixfreqobj:= IntegerObject,
- GA_DISABLED, (IF preferences.audiomix THEN FALSE ELSE TRUE),
- GA_ID, GAD_AUDIOMIXFREQ,
- INTEGER_NUMBER, preferences.audiomixfreq,
- INTEGER_MAXCHARS, 6,
- INTEGER_MINIMUM, 1000,
- INTEGER_MAXIMUM, 60000,
- EndMember,
-
- StartMember, limitdecodefreqobj:= IntegerObject,
- GA_DISABLED, (IF preferences.limitdecode THEN FALSE ELSE TRUE),
- GA_ID, GAD_LIMITDECODEFREQ,
- INTEGER_NUMBER, preferences.limitfreq,
- INTEGER_MAXCHARS, 6,
- INTEGER_MINIMUM, 1000,
- INTEGER_MAXIMUM, 80000,
- EndMember,
-
- StartMember, seektimeobj:= IntegerObject,
- GA_DISABLED, (IF preferences.seek THEN FALSE ELSE TRUE),
-
- GA_ID, GAD_SEEKTIME,
- INTEGER_NUMBER, preferences.seektime,
- INTEGER_MAXCHARS, 10,
- INTEGER_MINIMUM, 0,
- EndMember,
-
- StartMember, ahimodeobj:= StringObject,
- GA_ID, GAD_AHIMODE,
- STRINGA_TEXTVAL,StringF(filename,'\h',preferences.ahimode),
- STRINGA_MAXCHARS, 10,
- GA_DISABLED, (IF preferences.ahi THEN FALSE ELSE TRUE),
-
- STRINGA_MINVISIBLE, 8,
- -> STRINGA_HOOKTYPE, SHK_HEXIDECIMAL,
- EndMember,
- EndGroup,
- EndGroup,
- EndGroup,
- EndGroup,
-
- EndWindow
-
-
- -> Object creation sucessful?
- IF win_object
-
-
- -> Open the window.
-
- IF (window := CA_OpenWindow(win_object))
-
- -> Obtain the window wait signal mask.
-
- GetAttr(WINDOW_SIGMASK, win_object, {signal})
-
- -> Input Event Loop
-
- asig := Shl(1,appport.sigbit)
-
- WHILE (done = FALSE)
- Wait(signal OR asig)
-
- WHILE ((result := CA_HandleInput(win_object,{code})) <> WMHI_LASTMSG)
-
- tmpres1 := (result AND WMHI_CLASSMASK)
-
- SELECT tmpres1
-
- CASE WMHI_CLOSEWINDOW ; done := TRUE
-
- CASE WMHI_GADGETUP
- tmpres1 := (result AND WMHI_GADGETMASK)
-
- SELECT tmpres1
- CASE GAD_QUIET
-
- disableGadget(nocounterobj, getState(quietobj))
- disableGadget(timecountobj, getState(quietobj))
-
- CASE GAD_PLAY
- Forbid()
- IF (proc := FindTask({childname}))
- Signal(proc,SIGBREAKF_CTRL_C)
- Permit()
- ELSE
- Permit()
- GetAttr(CHOOSER_SELECTED, freqdivobj, {code})
- SELECT code
- CASE 0 ; code := 1
- CASE 1 ; code := 2
- CASE 2 ; code := 4
- ENDSELECT
- StringF(args1,'-d \d ',code)
-
- GetAttr(CHOOSER_SELECTED, qualityobj, {code})
- StrAdd(args1,StringF(args2,'-q \d ',code))
-
- GetAttr(INTEGER_NUMBER, priobj, {code})
- StrAdd(args1,StringF(args2,'-p \d ',code))
-
- GetAttr(INTEGER_NUMBER, bufferobj, {code})
- StrAdd(args1,StringF(args2,'-t \d ',code))
-
- GetAttr(INTEGER_NUMBER, volumeobj, {code})
- code := (256*code)/400
- StrAdd(args1,StringF(args2,'-v \d ',code))
-
- GetAttr(INTEGER_NUMBER, filebufferobj, {code})
- StrAdd(args1,StringF(args2,'-b \d ',code))
-
- IF getState(silentobj) THEN StrAdd(args1,'-s ')
-
- IF getState(monoobj) THEN StrAdd(args1,'-m ')
-
- IF getState(waitbufobj) THEN StrAdd(args1,'-w ')
-
- IF getState(timecountobj) THEN StrAdd(args1,'-T ')
-
- IF getState(filterobj) THEN StrAdd(args1,'-f 1 ') ELSE StrAdd(args1,'-f 0 ')
-
- IF getState(audiomixobj)
- GetAttr(INTEGER_NUMBER, audiomixfreqobj, {code})
- StrAdd(args1,StringF(args2,'-x \d ',code))
- ENDIF
-
- IF getState(limitdecodeobj)
- GetAttr(INTEGER_NUMBER, limitdecodefreqobj, {code})
- StrAdd(args1,StringF(args2,'-F \d ',code))
- ENDIF
-
- IF getState(ahiobj)
- GetAttr(STRINGA_TEXTVAL, ahimodeobj, {filename})
- StrAdd(args1,StringF(args2,'-I\s ',filename))
- ENDIF
-
- IF getState(seekobj)
- GetAttr(INTEGER_NUMBER, seektimeobj, {code})
- StrAdd(args1,StringF(args2,'-S \d ',code))
- ENDIF
-
- /* If no output, then also disable header -> will also improve speed */
- IF ((code := getState(quietobj)) OR getState(nocounterobj)) THEN StrAdd(args1,'-n ')
-
-
- GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
-
- play(filename,args1, code)
- ENDIF
-
- CASE GAD_FILENAME
- GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
-
- setSource(filename)
-
- CASE GAD_POP
- GetAttr(STRINGA_TEXTVAL, filenameobj, {filename})
- getFile(GET_FILE, filename)
-
- CASE GAD_PREFS
-
- preferences.freqdiv := GetAttr(CHOOSER_SELECTED, freqdivobj, {code}) BUT code
- preferences.quality := GetAttr(CHOOSER_SELECTED, qualityobj, {code}) BUT code
- preferences.taskpri := GetAttr(INTEGER_NUMBER, priobj, {code}) BUT code
- preferences.volume := GetAttr(INTEGER_NUMBER, volumeobj, {code}) BUT code
- preferences.buffer := GetAttr(INTEGER_NUMBER, bufferobj, {code}) BUT code
- preferences.filebuf := GetAttr(INTEGER_NUMBER, filebufferobj, {code}) BUT code
- preferences.mono := getState(monoobj)
- preferences.waitbuf := getState(waitbufobj)
- preferences.quiet := getState(quietobj)
- preferences.silent := getState(silentobj)
- preferences.nocounter := getState(nocounterobj)
- preferences.timecount := getState(timecountobj)
- preferences.filter := getState(filterobj)
- preferences.audiomix := getState(audiomixobj)
- preferences.audiomixfreq := GetAttr(INTEGER_NUMBER, audiomixfreqobj, {code}) BUT code
- preferences.limitdecode :=getState(limitdecodeobj)
- preferences.limitfreq := GetAttr(INTEGER_NUMBER, limitdecodefreqobj, {code}) BUT code
- preferences.ahi := getState(ahiobj)
- preferences.ahimode := GetAttr(STRINGA_TEXTVAL, filenameobj, {filename}) BUT Val(filename)
- preferences.seek := getState(seekobj)
- preferences.seektime := GetAttr(INTEGER_NUMBER, seektimeobj, {code}) BUT code
-
- prefs(preferences)
-
- CASE GAD_AUDIOMIX
- disableGadget(audiomixfreqobj,Not(getState(audiomixobj)))
- CASE GAD_LIMITDECODE
- disableGadget(limitdecodefreqobj,Not(getState(limitdecodeobj)))
- CASE GAD_SEEK
- disableGadget(seektimeobj,Not(getState(seekobj)))
- CASE GAD_AHI
- disableGadget(ahimodeobj,Not(getState(ahiobj)))
- ENDSELECT
-
- CASE WMHI_ICONIFY
- IF (CA_Iconify(win_object)) THEN window := NIL
-
- CASE WMHI_UNICONIFY
- window := CA_OpenWindow(win_object)
-
- ENDSELECT
- ENDWHILE
- ENDWHILE
- ENDIF
-
- DisposeObject(win_object)
- ENDIF
-
- EXCEPT DO
-
- -> We already notified the user if the exception was "LIB".
-
- IF (exception >0) AND (exception <> "LIB") THEN request_d('Failed to start CAMP.')
-
- IF appport THEN DeleteMsgPort(appport)
-
- -> Close the gadgets/classes.
-
- IF freqlist THEN freeChooserLabels(freqlist)
- IF qualitylist THEN freeChooserLabels(qualitylist)
-
- CloseLibrary(aslbase) -> CloseLibrary(NIL) is legal.
- CloseLibrary(bevelbase)
- CloseLibrary(labelbase)
- CloseLibrary(checkboxbase)
- CloseLibrary(integerbase)
- CloseLibrary(chooserbase)
- CloseLibrary(buttonbase)
- CloseLibrary(layoutbase)
- CloseLibrary(windowbase)
- CloseLibrary(iconbase)
-
- IF scr THEN UnlockPubScreen(NIL,scr)
-
- ENDPROC
-
-
-
- PROC prefs(prefs:PTR TO campPrefs) HANDLE
- DEF prefs_object,
- prefs_win,
- pathobj,
- condefobj,
-
- signal,
- done=FALSE,
- result,
- code,
- tmpres1,
- filename[256]:STRING,
- lock
-
-
- prefs_object := WindowObject,
- WA_TITLE, 'CAMP - Preferences',
- WA_DEPTHGADGET, TRUE,
- WA_SIZEBBOTTOM, TRUE,
- WA_SIZEGADGET,TRUE,
- WA_DRAGBAR, TRUE,
- WA_RMBTRAP, TRUE,
- WA_ACTIVATE,TRUE,
-
- WINDOW_POSITION, WPOS_CENTERSCREEN,
- WINDOW_LOCKHEIGHT, TRUE,
-
- WINDOW_PARENTGROUP, VGroupObject,
- LAYOUT_DEFERLAYOUT, TRUE,
- LAYOUT_SPACEOUTER, TRUE,
-
- StartHGroup,
-
- StartVGroup, EvenSized,
-
- StartMember, pathobj := StringObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_FILENAME,
- STRINGA_MAXCHARS, 256,
- STRINGA_MINVISIBLE, 25,
- STRINGA_TEXTVAL, mpegapath,
- EndMember,
- MemberLabel('MPEGA _Path'),
-
-
- StartMember, condefobj := StringObject,
- GA_RELVERIFY, TRUE,
- STRINGA_MAXCHARS, 256,
- STRINGA_MINVISIBLE, 25,
- STRINGA_TEXTVAL, condef,
- EndMember,
- MemberLabel('Text _Output'),
- EndGroup,
-
- StartMember, ButtonObject,
- BUTTON_AUTOBUTTON, BAG_POPFILE,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_POP,
- EndMember,
- CHILD_WEIGHTEDWIDTH, 0,
- CHILD_WEIGHTEDHEIGHT,0,
-
- EndGroup,
-
-
- StartHGroup, EvenSized,
- /*
- StartMember, ButtonObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_DEFAULT,
- GA_TEXT,'_Default',
- EndMember,
- */
- StartMember, ButtonObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_SAVE,
- GA_TEXT,'_Save',
- EndMember,
-
- StartMember, ButtonObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_USE,
- GA_TEXT,'_Use',
- EndMember,
-
- StartMember, ButtonObject,
- GA_RELVERIFY, TRUE,
- GA_ID, GAD_CANCEL,
- GA_TEXT,'_Cancel',
- EndMember,
-
- EndGroup,
-
- EndGroup,
-
- EndWindow
-
-
- -> Object creation sucessful?
- IF prefs_object
-
- -> Open the window.
-
- IF (prefs_win := CA_OpenWindow(prefs_object))
-
- -> Obtain the window wait signal mask.
-
- GetAttr(WINDOW_SIGMASK, prefs_object, {signal})
-
- -> Input Event Loop
-
- WHILE (done = FALSE)
- Wait(signal)
-
- WHILE ((result := CA_HandleInput(prefs_object,{code})) <> WMHI_LASTMSG)
-
- tmpres1 := (result AND WMHI_CLASSMASK)
-
- SELECT tmpres1
-
- CASE WMHI_CLOSEWINDOW ; done := TRUE
-
- CASE WMHI_GADGETUP
- tmpres1 := (result AND WMHI_GADGETMASK)
-
- SELECT tmpres1
- CASE GAD_FILENAME
- GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
- IF (lock := Lock(filename,SHARED_LOCK))
- UnLock(lock)
- ELSE
- SetWindowTitles(prefs_win,'File not found!',-1)
- DisplayBeep(scr)
- ENDIF
-
- CASE GAD_POP
- getFile(GET_MPEGA,mpegapath)
- IF SetGadgetAttrsA(pathobj, prefs_win, NIL, [STRINGA_TEXTVAL, mpegapath, TAG_END]) THEN RefreshGList(pathobj,prefs_win, NIL, 1)
-
- CASE GAD_SAVE
- GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
- StrCopy(mpegapath,filename)
-
- GetAttr(STRINGA_TEXTVAL, condefobj, {filename})
- StrCopy(condef,filename)
-
- savePrefs({arcprefsname},prefs)
- savePrefs({prefsname},prefs)
-
- done := TRUE
-
- CASE GAD_USE
- GetAttr(STRINGA_TEXTVAL, pathobj, {filename})
- StrCopy(mpegapath,filename)
-
- GetAttr(STRINGA_TEXTVAL, condefobj, {filename})
- StrCopy(condef,filename)
- done := TRUE
-
- CASE GAD_CANCEL
- done := TRUE
- /*
- CASE GAD_DEFAULT
- done := TRUE
- defaultPrefs()
- ->TODO: Update all gadgets in the main window.
- */
- ENDSELECT
-
- ENDSELECT
-
- ENDWHILE
-
- ENDWHILE
- ENDIF
-
- DisposeObject(prefs_object)
- ENDIF
- EXCEPT
- -> Trap exceptions
- ENDPROC
-
-
- /* Save prefs to disk */
- PROC savePrefs(filename:PTR TO CHAR,prefs:PTR TO campPrefs)
- DEF handle
-
- IF (handle := Open(filename,NEWFILE))
- FputC(handle,PREFSVER)
- Fputs(handle,mpegapath)
- FputC(handle,"\n")
- Fputs(handle,condef)
- FputC(handle,"\n")
- Fwrite(handle,prefs,SIZEOF campPrefs,1)
- Close(handle)
- ENDIF
-
- ENDPROC
-
-
- /* Set default prefs */
- PROC defaultPrefs(preferences:PTR TO campPrefs)
- StrCopy(mpegapath,'C:mpega')
- StrCopy(condef,'CON:0/25//100/CAMP Output/AUTO')
- preferences.freqdiv := 0
- preferences.quality := 0
- preferences.taskpri := 0
- preferences.volume := 100
- preferences.buffer := 100
- preferences.filebuf := 16
- preferences.mono := FALSE
- preferences.quiet := FALSE
- preferences.silent := FALSE
- preferences.waitbuf := FALSE
- preferences.nocounter := FALSE
- preferences.timecount := FALSE
- preferences.filter := FALSE
- preferences.audiomix := FALSE
- preferences.audiomixfreq := 28000
- preferences.limitdecode := FALSE
- preferences.limitfreq := 28000
- preferences.ahi := FALSE
- preferences.ahimode := 0
- preferences.seek := FALSE
- preferences.seektime := 0
- ENDPROC
-
-
- /*** AppMessage hook ***/
- /* hook is unusued, as well as winobj (our window PTR is global) */
-
- PROC appMsgFunc(hook:PTR TO hook, winobj:PTR TO object, msg:PTR TO appmessage)
- DEF i, arg:PTR TO wbarg, name[256]:STRING
-
- i := msg.numargs
- arg := msg.arglist
-
- WHILE i
-
- DEC i
-
- NameFromLock(arg.lock, name, 256)
- AddPart(name,arg.name, 256)
-
- arg++
-
- ENDWHILE
-
- IF SetGadgetAttrsA(filenameobj, window, NIL, [STRINGA_TEXTVAL, name, TAG_END]) THEN RefreshGList(filenameobj, window, NIL, 1)
-
- setSource(name)
- ENDPROC
-
-
- PROC setSource(filename)
- DEF handle
- DEF command[256]:STRING
- DEF buffer[256]:STRING
- DEF tmpfile: PTR TO CHAR
-
- tmpfile := 'T:camp.temp'
-
- IF (handle := Open(tmpfile,MODE_NEWFILE))
- StringF(command,'\s -h "\s"',mpegapath, filename)
-
- SystemTagList(command, [SYS_OUTPUT, handle,
- NP_STACKSIZE, 20000,
- TAG_END])
-
- Flush(handle)
- /* Rewind to the start */
- Seek(handle,0,OFFSET_BEGINING)
-
- /* Skip the header text */
- Fgets(handle,buffer,255)
- Fgets(handle,buffer,255)
- Fgets(handle,buffer,255)
- Fgets(handle,buffer,255)
- Fgets(handle,buffer,255)
- Fgets(handle,buffer,255)
-
- /* Chops the last char (a CR) and copy into a global var so it can be
- used in our wiwndow title - SetWindowTitles() does NOT copy it. */
-
- StrCopy(title,buffer,StrLen(buffer)-1)
-
- SetWindowTitles(window,title,-1)
- Close(handle)
- DeleteFile(tmpfile)
- ENDIF
-
- /* Will enable only if it's a proper MP? file */
- IF SetGadgetAttrsA(playobj, window, NIL, [GA_DISABLED, (IF (InStr(title,'Unable to',0) <> -1) THEN TRUE ELSE FALSE), TAG_END]) THEN RefreshGList(playobj, window, NIL, 1)
-
- ENDPROC
-
-
- /*** Play it Sam ***/
- PROC play(filename,arguments,quiet)
- DEF io, mpegaseg
-
-
- StringF(tmparg ,'\s "\s"',arguments, filename)
-
- IF (mpegaseg := NewLoadSeg(mpegapath,NIL)) = NIL THEN RETURN
-
- IF quiet = FALSE
- IF (io := Open(condef,MODE_NEWFILE)) = NIL THEN quiet := TRUE
- ENDIF
-
- CreateNewProc([NP_SEGLIST, mpegaseg,
- NP_FREESEGLIST,TRUE,
- (IF quiet THEN TAG_IGNORE ELSE NP_OUTPUT), io,
- NP_NAME, {childname},
- NP_CLI, TRUE,
- NP_ARGUMENTS,tmparg,
- TAG_END])
-
- ENDPROC
-
-
-
- /*** Disable/enable a gadget ***/
- PROC disableGadget(gad, disable)
- IF SetGadgetAttrsA(gad, window, NIL,[GA_DISABLED, (IF disable THEN TRUE ELSE FALSE), TAG_DONE]) THEN RefreshGList(gad, window, NIL, 1)
- ENDPROC
-
-
-
- /*** Opens a file requester ***/
-
- PROC getFile(type,current:PTR TO CHAR) HANDLE
- DEF req:PTR TO filerequester
- DEF filename[256]:STRING
- DEF len
-
- /* Why try to open it at statup since it might not even be needed? */
-
- IF aslbase = NIL THEN aslbase := myOpenClass('asl.library',37,TRUE)
-
- IF (len := StrLen(current))
- StrCopy(filename,current,len-StrLen(PathPart(current)))
- ENDIF
-
- IF req:=AllocAslRequest(ASL_FILEREQUEST,
- [ASLFR_TITLETEXT,(IF type = GET_MPEGA THEN 'Select the mpega executable' ELSE 'Select an MP2/MP3 file'),
- ASLFR_DOPATTERNS , (IF type = GET_MPEGA THEN FALSE ELSE TRUE),
- (IF type = GET_MPEGA THEN TAG_IGNORE ELSE ASLFR_INITIALPATTERN) , '#?.(mp2|mp3)',
- (IF len THEN ASLFR_INITIALFILE ELSE TAG_IGNORE), (IF len THEN FilePart(current) ELSE NIL),
- ASLFR_INITIALDRAWER,filename,
- ASLFR_SCREEN,scr,
- NIL])
-
- IF AslRequest(req,NIL)
- IF StrLen(req.file) >0
- StrCopy(filename,req.drawer,ALL)
- AddPart(filename,req.file,500)
- SetStr(filename,StrLen(filename))
-
- IF type = GET_FILE
- IF SetGadgetAttrsA(filenameobj, window, NIL, [STRINGA_TEXTVAL, filename, TAG_END]) THEN RefreshGList(filenameobj, window, NIL, 1)
-
- setSource(filename)
- ELSE
- StrCopy(mpegapath,filename)
- ENDIF
- ENDIF
- ENDIF
- FreeAslRequest(req)
- ENDIF
- EXCEPT
- /* Just to intercept exceptions raised by myOpenClass() failures */
-
- ENDPROC
-
-
- /*** Returns if a gadget is selected (TRUE) or not (FALSE) ***/
-
- PROC getState(gad)
- DEF state
- GetAttr(GA_SELECTED, gad, {state})
-
- /* Must do it this way, because we're getting '1' rather than '-1', which
- wouldn't allow us to use Not() later to invert it. */
-
- IF state THEN RETURN TRUE ELSE RETURN FALSE
- ENDPROC
-
-
- PROC myOpenClass(name,version, lib=FALSE)
- DEF retval, buffer[256]:STRING
-
- IF ((retval := OpenLibrary(name, version)) = NIL) AND (lib=TRUE)
- StringF(buffer, 'SYS:Classes/\s', name)
- IF (retval := OpenLibrary(buffer, version)) = NIL
- StringF(buffer, 'Classes/\s', name)
- retval := OpenLibrary(buffer, version)
- ENDIF
- ENDIF
-
- IF retval = NIL
- StringF(buffer,'Can''t open "\s" V\d or better!',name,version)
- request_d(buffer)
- Raise("LIB")
- ENDIF
- ENDPROC retval
-
-
- PROC request_d(string) IS EasyRequestArgs(NIL,[20,0,'CAMP',string,'Damn!'],0,NIL)
-
- CHAR '$VER: CAMP 1.0 (24.6.97) by Eric Sauvageau.' ,0
-
- prefsname:
- CHAR 'env:camp.prefs',0
- arcprefsname:
- CHAR 'envarc:camp.prefs',0
-
- childname:
- CHAR 'BootCamp',0
-